<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    javascript在创建字符串\变量\对象等时,会自动分配内存,并在不使用时自动释放,也叫垃圾回收
    但是这个自动成为了混乱的根源,使得javascript开发者们错误的认为他们不需要关心内存管理

    内存生命周期
    不管什么语言 内存生命周期都是基本一致的
    分配内存-使用内存-释放内存
    分配内存:分配你所需要的内存
    使用内存: 使用你分配到的内存(读\写)
    释放内存: 不需要时将它释放

    在所有语言中,使用内存都是明确的,分配内存和释放内存在底层语言中是明确的
    但是在javascript这种高级语言中大部分是隐含的

    垃圾回收
    垃圾回收机制分为两种
    引用计数法：这是最初级的垃圾回收算法，他把“是否不再需要”简单定义为“对象是否被对象引用”
    没有引用指定该对象时会被回收。也就是内存占用一次计数加一，移除占用计数减一，当计数为0时
    被垃圾回收机制回收

    标记清除，该算法把‘对象是否需要’简单定义为‘对象是否可以获取的’，
    最常用的垃圾回收机制就是标记清除，当变量进入执行环境时，被标记‘进入环境’
    当变量离开执行环境时，被标记为‘离开环境’。某一个时刻，垃圾回收器会过滤叼环境中的变量
    以及被环境百年来引用的变量，剩下的就是被是为准备回收的变量

    标记清除：该算法把“是否需要的对象”简单定义为“是否可以获取的对象
    最常用的垃圾回收机制算法时标记清除，当变量进入执行环境，被你标记为进入环境
    当变量离开执行环境，被标记为离开环境。某一时刻，垃圾回收机制会回收过滤掉环境中的变量，
    以及被环境变量引用的变量，剩下的被视为准备回收的变量

    引用计数法：这使得垃圾回收机制打得最初级算法，他把”对象是否需要“简单定义为”对象是否被引用“
    当没有引用指向对象时，会被回收。占用内存一次，计数加一，移出内存一次，计数减一，当计数为0
    对象被回收

    标记清除：该算法把“是否需要对象”简单定义成“对象是否可以被获取”，标记清除是
    最常用的垃圾回收机制算法，当变量进入执行环境被标记为进入环境，当变量离开执行环境，
    被标记为离开环境，在某一时刻，垃圾回收机制会过滤环境中的变量，以及被环境变量引用的变量
    剩下的视为准备回收的变量

    内存泄漏就是当一块内存没有被应用程序使用，但是因为某种原因没有返回应用程序或者内存池的现象
    内存泄漏可能会导致应用程序卡顿或者崩溃

    没有清理的DOM元素引用
    当DOM被删除但是DOM的引用没有被删除时,会出现内存泄漏
    解决方法: 手动删除
    被遗忘的定时器或者回调
    当setInterval或者setTimeout不需要使用且没被clear时,回调函数的和内部变量不会被释放
    解决方法:比如vue中使用了定时器,需要在beforeDestroy中销毁,js也同理

    div中的ul li 得到这个div,会间接引用某个li,此时这个li就算被删除了,也还会保留在内存中
    并且只要li不被删除,他的父元素也不会被删除
    解决: 手动删除


    div中的ul li 得到这个div会间接引用某个li,此时这个li就算被删除了,也会被保留在聂存中
    并且只要这个li不被删除,他的父元素也不会被删除
    解决: 手动删除

</body>
</html>